package com.feng.study.demo.juc;


import java.util.concurrent.*;

/**
 * 使用ThreadPoolExecutor创建线程池
 * 七个参数：
 *      corePoolSize：核心线程数。
 *      maximumPoolSize：最大核心线程池 大小。
 *      keepAliveTime：空闲线程存活时间。
 *          空闲线程存活时间，当线程池中没有任务时，会销毁一些线程，销毁的线程数=maximumPoolSize（最大线程数）-corePoolSize（核心线程数）。
 *      TimeUnit：时间单位。JUC包下的工具类。
 *      BlockingQueue：线程池阻塞队列。
 *          阻塞队列uml图：BlockingQueue.uml
 *      ThreadFactory：创建线程的工厂。
 *      RejectedExecutionHandler：拒绝策略。队列也满了
 *          四个拒绝策略:
 *          ThreadPoolExecutor.AbortPolicy：拒绝并抛出异常。
 *          ThreadPoolExecutor.CallerRunsPolicy：使用当前调用的线程来执行此任务。
 *          ThreadPoolExecutor.DiscardOldestPolicy：尝试和最早的竞争，竞争到则执行，竞争不到，也不会抛出异常。
 *          ThreadPoolExecutor.DiscardPolicy：丢掉任务。且不抛异常
 */
public class ExecutorDemo {
    public static void main(String[] args) {
        // 阿里巴巴编码规范，强制不允许使用Executors创建线程池
        ExecutorService executorService = Executors.newSingleThreadExecutor();
        ExecutorService executorService1 = Executors.newFixedThreadPool(10);
        ExecutorService executorService2 = Executors.newCachedThreadPool();

        // 强制使用ThreadPoolExecutor创建线程池
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
                8,
                32,
                10,
                TimeUnit.SECONDS,
                new LinkedBlockingDeque<>(100),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy());
    }
}
